import foodModel from '../models/foodModel.js';
import fs from 'fs';

// all food list
/**
 * 该函数从数据库中检索食物数据，并添加图像URL后返回数据
 * @param {Object} req 请求对象，包含有关HTTP请求的信息
 * @param {Object} res 响应对象，用于发送HTTP响应
 */
const listFood = async (req, res) => {
  try {
    // 从数据库查询所有食物信息
    const foods = await foodModel.find({});
    // 构建存储食物图像的基础URL
    const baseUrl = `${req.protocol}://${req.get('host')}/uploads/`;

    // 为每个食物项添加图像URL
    const foodsWithImages = foods.map((food) => ({
      ...food._doc, // 展开原始食物文档
      image: `${baseUrl}${food.image}`, // 添加食物图像的完整URL
    }));

    // 以JSON格式返回处理后的食物信息
    res.json({ success: true, data: foodsWithImages });
    // 记录响应信息
    console.log(res.foods);
  } catch (error) {
    // 记录错误信息
    console.log(error);
    // 如果发生异常，返回错误响应
    res.json({ success: false, message: 'Error' });
  }
};


// add food
/**
 * 该函数处理食物信息的添加，包括上传食物图片。
 * @param {Object} req - 请求对象，包含用户上传的食物信息和图片文件。
 * @param {Object} res - 响应对象，用于返回添加食物的结果。
 */
const addFood = async (req, res) => {
  // 检查是否上传了文件
  if (!req.file) {
    return res.json({ success: false, message: 'No file uploaded' });
  }

  // 获取上传文件的文件名
  let image_filename = `${req.file.filename}`;

  // 创建一个新的食物实例
  const food = new foodModel({
    name: req.body.name,
    description: req.body.description,
    price: req.body.price,
    category: req.body.category,
    image: image_filename,
  });

  // 尝试保存食物信息
  try {
    await food.save();
    // 如果成功，返回成功消息
    res.json({ success: true, message: 'Food Added' });
  } catch (error) {
    // 如果发生错误，记录错误信息并返回失败消息
    console.log('Error saving food:', error);
    res.json({ success: false, message: 'Error' });
  }
};

// delete food
/**
 * 异步删除指定ID的食物项
 * @param {Object} req - 请求对象，包含params中的食物项ID。
 * @param {Object} res - 响应对象，用于向客户端发送响应。
 */
const removeFood = async (req, res) => {
  try {
    // 尝试通过ID查找食物项
    const food = await foodModel.findById(req.params.id);

    // 如果食物项不存在，返回404错误响应
    if (!food) {
      return res
        .status(404)
        .json({ success: false, message: '食物项未找到' });
    }

    // 如果食物项有图像，尝试删除图像文件
    if (food.image) {
      fs.unlink(`uploads/${food.image}`, (err) => {
        if (err) {
          console.error('删除图像文件时出错:', err);
        }
      });
    }

    // 从数据库中删除食物项
    await foodModel.findByIdAndDelete(req.params.id);

    // 返回成功响应
    res.json({ success: true, message: '食物已删除' });
  } catch (error) {
    // 如果发生错误，记录错误并返回500错误响应
    console.log('删除食物时出错:', error);
    res.status(500).json({ success: false, message: '删除食物时出错' });
  }
};


// update food
/**
 * 更新食物信息的异步函数
 * @param {Object} req - Express请求对象，包含要更新的食物信息和文件
 * @param {Object} res - Express响应对象，用于发送响应
 */
const updateFood = async (req, res) => {
  // 从请求参数中获取食物ID
  const { id } = req.params;

  try {
    // 根据ID查找食物
    const food = await foodModel.findById(id);
    // 如果找不到食物，返回404错误
    if (!food) {
      return res
        .status(404)
        .json({ success: false, message: 'Food item not found' });
    }

    // 更新食物的名称、描述、价格和类别，如果请求体中没有提供这些字段，则保留原值
    food.name = req.body.name || food.name;
    food.description = req.body.description || food.description;
    food.price = req.body.price || food.price;
    food.category = req.body.category || food.category;

    // 如果请求中包含文件
    if (req.file) {
      // 如果食物已有图片，删除旧的图片文件
      if (food.image) {
        fs.unlink(`uploads/${food.image}`, (err) => {
          if (err) {
            console.error('Error deleting old image file:', err);
          }
        });
      }
      // 更新食物的图片为新的文件名
      food.image = req.file.filename;
    }

    // 保存更新后的食物
    await food.save();
    // 返回成功响应，包含更新后的食物信息
    res.json({ success: true, message: 'Food Updated', data: food });
  } catch (error) {
    // 如果发生错误，记录错误并返回500错误
    console.log('Error updating food:', error);
    res.status(500).json({ success: false, message: 'Error updating food' });
  }
};


//get category
/**
 * 异步获取类别列表
 * @param {Object} req Express请求对象，包含请求信息
 * @param {Object} res Express响应对象，用于发送HTTP响应
 */
const getCategories = async (req, res) => {
  try {
    // 异步查询数据库中的所有类别
    const categories = await Category.find({});
    // 成功时，返回包含类别数据的JSON响应
    res.json({ success: true, data: categories });
  } catch (error) {
    // 记录错误信息
    console.error(error);
    // 发生错误时，返回表示服务器错误的JSON响应
    res.status(500).json({ success: false, message: 'Server Error' });
  }
};

export { listFood, addFood, removeFood, updateFood, getCategories };
